Repository navigation
Fix :ide AOT segfault and bare Esc; dashboard node Info tab; terminal-escape hardening (v1.65.0) - #144
Merged
Conversation
renderDiff promoted `previous` through a `reusable` boolean; the Dart 3.13 AOT compiler hoisted `previous._cells` past that guard, reading from null on the first frame. Resolve the previous cells to a nullable local before the loop instead. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Codecov Report❌ Patch coverage is
📢 Thoughts on this report? Let us know! |
…runtime (v1.65.0) An opened node now has Sessions / Info / Credentials tabs (s / i / c; i on the node list opens Info directly). Info shows identity, OS and OS version, arch, CPU count, hostname, agent version vs. this client, Dart runtime, capabilities, labels and the connection. PlatformInfo gains optional osVersion, cpuCount and runtimeVersion, omitted from the JSON when unknown so older nodes and Hubs interoperate. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A lone ESC byte stayed buffered in KeyDecoder until another key arrived, so a bare Esc did nothing in :ide or the dashboard until the next keypress. Both apps now flush it after KeyDecoder.escapeTimeout (50 ms) when nothing follows; a sequence split across reads still decodes. Tests: an integration test AOT-compiles a renderDiff driver (it crashes on the 1.64.2 code), node-tab navigation and Esc, a node dropping out on refresh, mid-word wrapping, split arrow keys, and :info's new fields. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- ScreenBuffer paints control characters as U+FFFD and :info strips them, so node-reported text (hostname, labels, OS version) cannot inject terminal escape sequences. - Dashboard: a background credentials load that settles after the user left the tab or node is dropped instead of landing on another screen; Esc on Info/Credentials leaves the node with no RPC; returning to Sessions only fetches when never loaded. - Info rows are typed (no colouring by label text); label keys go whole into the wrapping column; wrapping measures runes, not UTF-16 units. - The Sessions tab shows a one-line summary instead of duplicating Info. - The lone-ESC timeout lives in one LoneEscapeTimer used by both apps. - Reference the upstream VM bug (dart-lang/sdk#63413, backport request dart-lang/sdk#64723) in the renderDiff comment and CHANGELOG. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Fixed:
omnyshell idesegfault on first frameomnyshell ide .crashed withSIGSEGV(si_addr=0xfinScreenBuffer.renderDiff). Seen on Linux x64 (Dart 3.13.0) and reproduced on macOS arm64.previous._cellsabove thereusableguard that promotedpreviousto non-null. It affects 3.11.0–3.13.7 and is fixed in 3.14 beta and 3.15 dev. I filed a stable backport request: Request: cherry-pick LICM fix 8b8021bc (#63413) to stable 3.13 — AOT SIGSEGV still reproduces on 3.13.7 dart-lang/sdk#64723.test/integration/aot_render_test.dartAOT-compiles a smallrenderDiffdriver and runs it. It fails on the 1.64.2 code with the reported crash and takes about 2 s.Fixed: a bare Esc did nothing in
:ideand the dashboardKeyDecoderuntil another key arrived. A newLoneEscapeTimer, shared by both apps, delivers it as Escape after 50 ms with no more input. Escape sequences split across two reads still decode.Added: node Info tab in the dashboard
s/i/c).ion the node list opens a node straight onto Info. Esc on any of them goes back to the node list.rrefreshes it.PlatformInfogains optionalosVersion,cpuCountandruntimeVersion, left out of the JSON when unknown. Older nodes and Hubs keep working, and the tab shows "not reported" for them.:infoshows the new fields too.Security: node-supplied text can't inject terminal escapes
ScreenBufferpaints control characters (C0, DEL, C1) as�and:infostrips them. Before this, a hostile node's hostname, labels or OS version could clear the screen, set the window title or write to the clipboard on the user's terminal.Review fixes
I ran a high-effort review of the branch and addressed 9 of its 10 findings:
Statuswas colored like the node's statusI skipped one: tagging the AOT test as opt-in. It runs in about 2 s, and a tag would stop default CI from running it.
Bumps to 1.65.0 (1.64.2 was tagged) with CHANGELOG entries.
Test plan
ScreenBuffercontrol-character tests,:infostripping,LoneEscapeTimerunit tests,PlatformInforound-trip and wire shapeanalyze --fatal-infos, dependency_validator andpub publish --dry-runall cleantest/unit(1231) andtest/integration(298) pass locally🤖 Generated with Claude Code